package com.km.core.dto;

import java.math.BigDecimal;
import java.sql.Timestamp;
import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * 数据传输对象接口
 */
@SuppressWarnings("unused")
public interface Dto extends Map<String, Object> {

    /**
     * 以Integer类型返回键值
     */
    Integer getAsInteger(String pStr);

    /**
     * 以Long类型返回键值
     */
    Long getAsLong(String pStr);

    /**
     * 以String类型返回键值
     */
    String getAsString(String pStr);

    /**
     * 取出属性值
     */
    BigDecimal getAsBigDecimal(String pStr);

    /**
     * 取出属性值
     */
    Date getAsDate(String pStr);

    /**
     * 以List类型返回键值
     */
    <T> List<T> getAsList(String key);

    /**
     * 以Timestamp类型返回键值
     */
    Timestamp getAsTimestamp(String pStr);

    /**
     * 以Boolean类型返回键值
     */
    Boolean getAsBoolean(String key);

    /**
     * 获取第一个默认List对象<br>
     * 为了方便存取(省去根据Key来存取和类型转换的过程)
     */
    @SuppressWarnings("rawtypes")
    List getDefaultAList();

    /**
     * 给Dto压入第一个默认List对象<br>
     * 为了方便存取(省去根据Key来存取和类型转换的过程)
     */
    @SuppressWarnings("rawtypes")
    void setDefaultAList(List pList);

    /**
     * 获取第二个默认List对象<br>
     * 为了方便存取(省去根据Key来存取和类型转换的过程)
     */
    @SuppressWarnings("rawtypes")
    List getDefaultBList();

    /**
     * 给Dto压入第二个默认List对象<br>
     * 为了方便存取(省去根据Key来存取和类型转换的过程)
     */
    @SuppressWarnings("rawtypes")
    void setDefaultBList(List pList);

    /**
     * 获取默认的Json格式字符串
     */
    String getDefaultJson();

    /**
     * 给Dto压入一个默认的Json格式字符串
     */
    void setDefaultJson(String jsonString);

    /**
     * 将此Dto对象转换为XML格式字符串
     */
    String toXml(String pStyle);

    /**
     * 将此Dto对象转换为XML格式字符串<br>
     * 默认为节点元素值风格
     */
    String toXml();

    /**
     * 将此Dto对象转换为Json格式字符串<br>
     *
     * @return string 返回Json格式字符串
     */
    String toJson();

    String toJsonFilter();

    /**
     * 打印DTO对象<br>
     */
    void println();

    /**
     * 将此Dto对象转换为Json格式字符串(带日期时间型)<br>
     */
    String toJson(String pFormat);

    /**
     * 取出属性值
     *
     * @param pStr   :属性Key
     * @param format 格式化信息
     */
    Date getAsDate(String pStr, String format);

    /**
     * 以Byte 类型返回键值
     */
    Byte getAsByte(String pStr);

    /**
     * 往对象里头添加数据，并返回自身，以实现fluent build风格的编程
     */
    Dto put(String key, Object value);

    /**
     * 以Integer类型返回键值,如果值为空，则返回默认值
     */
    Integer getAsInteger(String pStr, int defaultValue);

    /**
     * 以String类型返回键值
     */
    String getAsString(String pStr, String defaultValue);

    /**
     * 以Byte 类型返回键值
     */
    Byte getAsByte(String pStr, byte defaultValue);

    /**
     * 获取double型的数据
     */
    Double getAsDouble(String pStr);

    /**
     * 获取double型的数据
     */
    Double getAsDouble(String pStr, Double defaultValue);

    /**
     * 获取Map数据对象
     */
    Dto getAsDto(String pStr);

    /**
     * 获取List<Dto> 数据对象
     */
    List<Dto> getAsDtoList(String string);

}
